package fr.iut.tp3.model;

import fr.iut.tp3.utils.StringUtils;

/**
 * Impl�mentation de {@link Utilisateur}.
 * 
 * @author Vianney DUPOY DE GUITARD
 */
public class UtilisateurImpl implements Utilisateur {

			
	public enum Privilege {
		ADMIN("Admin", 0), UTILISATEUR("Utilisateur", 1), INVITE("Invité", 2);

		private String label = "";
		private Integer valeur = 0;

		// Constructeur
		Privilege(String label, Integer valeur) {
			this.label = label;
			this.valeur = valeur;
		}

		public String getLabel() {
			return label;
		}

		public Integer getValeur() {
			return valeur;
		}

	}

	/** Son nom. */
	private String nom;

	/** Son login. */
	private String login;

	/** Son mot de passe. */
	private String password;

	/**
	 * <p>
	 * Son niveau de privilège.
	 * </p>
	 * <ul>
	 * <li>0: invité.</li>
	 * <li>1: utilisateur.</li>
	 * <li>2: administrateur</li>
	 * </ul>
	 */
	private Integer niveauPrivilege;

	/**
	 * Le login du supérieur hiérarchique de l'utilisateur.
	 */
	private String loginSuperieurHierarchique;

	/**
	 * Constructeur par défaut.
	 */
	public UtilisateurImpl() {
	}

	/**
	 * Initialise un utilisateur avec tous les paramètres possibles.
	 * 
	 * @param nom
	 *            : {@link #nom}.
	 * @param login
	 *            : {@link #login}.
	 * @param password
	 *            : {@link #password}.
	 * @param niveauPrivilege
	 *            : {@link #niveauPrivilege}.
	 */
	public UtilisateurImpl(String nom, String login, String password,
			Integer niveauPrivilege, String loginSuperieurHierarchique) {
		this.nom = nom;
		this.login = login;
		this.password = password;
		this.niveauPrivilege = niveauPrivilege;
		this.loginSuperieurHierarchique = loginSuperieurHierarchique;
	}

	/**
	 * @return {@link #nom}
	 */
	@Override
	public String getNom() {
		return nom;
	}

	/**
	 * @return {@link #login}
	 */
	@Override
	public String getLogin() {
		return login;
	}

	/**
	 * Vérifie le mot de passe avec celui passé en paramètre.
	 * 
	 * @return vrai s'ils sont identiques.
	 */
	@Override
	public boolean checkPassword(String password) {
		if (StringUtils.isBlank(password)) {
			return false;
		}
		return this.password.equals(password);
	}

	/**
	 * @return {@link #niveauPrivilege}
	 */
	@Override
	public Integer getNiveauPrivilege() {
		return niveauPrivilege;
	}

	/**
	 * @return {@link #loginSuperieurHierarchique}
	 */
	@Override
	public String getLoginSuperieurHierarchique() {
		return loginSuperieurHierarchique;
	}

	/**
	 * Définit {@link #nom}.
	 * 
	 * @param nom
	 *            : le nouveau nom.
	 */
	@Override
	public void setNom(String nom) {
		this.nom = nom;
	}

	/**
	 * Définit {@link #login}.
	 * 
	 * @param login
	 *            : le nouveau login.
	 */
	@Override
	public void setLogin(String login) {
		this.login = login;
	}

	/**
	 * Définit {@link #password}.
	 * 
	 * @param password
	 *            : le nouveau mot de passe.
	 */
	@Override
	public void setPassword(String password) {
		this.password = password;
	}

	/**
	 * Définit {@link #niveauPrivilege}.
	 * 
	 * @param niveauPrivilege
	 *            : le nouveau niveau.
	 */
	@Override
	public void setNiveauPrivilege(Integer niveauPrivilege) {
		this.niveauPrivilege = niveauPrivilege;
	}

	/**
	 * Définit {@link #loginSuperieurHierarchique}.
	 * 
	 * @param loginSuperieur
	 *            : le nouveau login.
	 */
	@Override
	public void setLoginSuperieurHierarchique(String loginSuperieur) {
		loginSuperieurHierarchique = loginSuperieur;
	}

	/**
	 * Donne le nom du niveau de privilege en string
	 * 
	 * @return
	 */
	public String getNiveauPrivilegeString() {
		switch (niveauPrivilege) {
		case 0:
			return Privilege.ADMIN.getLabel();
		case 1:
			return Privilege.UTILISATEUR.getLabel();
		case 2:
			return Privilege.INVITE.getLabel();
		default:
			return "";

		}

	}

	/**
	 * retourne les privileges en tableau
	 * @return
	 */
	public String[] privilegestoTab() {
		String[] tabValues = new String[Privilege.values().length];
		for (int id = 0; id < Privilege.values().length; id++) {
			tabValues[id] = Privilege.values()[id].getLabel();
		}
		return tabValues;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Utilisateur) {
			return ((Utilisateur) obj).getLogin().equals(login);
		} else {
			return super.equals(obj);
		}
	}

	@Override
	public String toString() {
		return login;
	}
}
